package com.tedu.api;

/**
 * JavaSE     基础语法       JavaOOP         JavaAPI【用--新华词典】
 *                                          Java帮助文档
 * 理解：查手册：类，抽象类，接口：具体功能【构造器，方法，属性】---使用功能
 *要求：会查API手册           JDK1.11-----向下兼容JDK1.8
 * JDK1.8.CHM文件           打不开----->netframework4.0
 * 左侧位---Packages         ①所有查包     【记住类在具体包】
 * String类-----Java写好的类         位于java.long包下
 * 位于java.long包下 ，可以不用导包
 * 左侧下位：接口，类，枚举，异常，错误，注解
 *
 * 已知现有包含：接口，类，抽象类  8000左右类【需要用，学】
 *
 * 知道一个类---API文件查【解释跟参考】--使用类
 *
 *【常用API：字符串，包装类，集合，线程，多线程，异常，IO流，Socket套接字-网络编程】
 *
 * 高手提供           类            抽象类             接口
 *   使用并且学习
 */

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.junit.Test;

import java.util.Locale;
import java.util.Scanner;

/**
 * JavaAPI帮助文档
 *  String字符串类-----位于Java.lang包下：不需要导入包
 *  String特性：String 类不可改变，由final修饰，不可以被继承
 *  字符串---通过字符数组----组成【底层封装字符数组，针对字符数组操作算法】
 *  字符串一旦创建，对象永远无法改变，但是字符串可以重新赋值
 *  Java字符串在内存中采用Unicode编码集【顶级编码集】：
 *  任意一个字符对应两个字节的定长编码，存汉字还是字母2个字节
 *
 */
public class StringAPI {
    @Test
    public void testString() {
        char[] c = {'H', 'E', 'L', 'L', 'O'};    //定义字符静态数组----字符串
        System.out.println(c);
        String str = "Hello";        //字符数组方法与属性--字符串共享
        str = "world";                //覆盖--修改【final修饰】
        System.out.println(str + "1");     //新对象
    }

/**
 * 常量池
 * String存在常量池[内存--JVM--堆]--->好处：减少内存开销
 * Java为了提高性能，，，静态字符串（字面量/常量/常量链接结果）
 * 在常量池中创建，并且使用同一个对象，，重用静态字符串
 * 对于重复出现字符串直接量，JVM虚拟机会从常量池当中进行获取
 * 如果查找到，返回改对象！
 */
    @Test
    public void testString1(){
        String s1="java123";        //常量池：s1的值保存常量池，取常量池
        String s2="java123";        //常量池：s2的值拿到是s1的值
        System.out.println(s1==s2);   //true  java123从常量池获取
        String s3="java"+"123";
        System.out.println(s1==s3);  //true
        // +  代表拼接字符串 JVM虚拟机对于字符串进行优化：右侧字面量形式自动计算
        //  计算后结果，通过引用进入堆内存中，找常量池中存在：java123死值
        //  s3重用s1的对象
        String s="java";
        String s4=s+"123";   //新对象，无法从常量池中获取
        //JVM虚拟机进行优化：引用对象+字面量，不可以进行计算
        System.out.println(s1==s4);    //false
        String s5=new String("java123");            //引用类型
        //new 出来的对象，全新对象
        System.out.println(s1==s5);  //常量池：java123==对象：java123
    }
    /**
     * String API 常用方法
     * Length（）方法    返回值：int
     * 用法：返回当前字符串的长度（个数）
     * 字符串：包括空格，字符，汉字......
     * Sting 类采用Unicode编码集：一个字符，，占2个字节
     */
    @Test
    public  void testLength(){
        String s="hello";      //占10个字节，使用length从1开始
        System.out.println(s.length());
        String s1="我爱Java";     //去掉空格，空格占字节
        System.out.println(s1.length());
    }
    /**
     * String API常用方法
     * indexOf方法【重点：重载】
     * indexOf（“字符”）
     * 用法：查找指定字符串中，首次出现的位置【下标位置】
     *      如果没有查到，返回-1
     * indexOf（“字符”，字符串位置）
     * 用法：查找到指定字符串位置的首次出现【下标位置】
     *      例如：woniwoniwo    查找相同的字符的下一位
     */
    @Test
    public void testIndexOf(){
        String str="thinking in java";
        int index=str.indexOf("in");
        System.out.println("返回坐标位置："+index);
        //重载方法：方法名相同，参数不同
        //indexOf（”查找字符串“，字符串位置）
        //功能：从指定位置下进行查找，下一个in的位置
        index=str.indexOf("in",7);
        System.out.println("返回坐标位置："+index);
        //5  下标位置：往后一位查找，     第二次出现in的位置
    }
    /**
     * String API方法
     * lastIndexOf（“字符”）
     * 用法：找到字符串中包含“字符”的最后一次出现位置【下标位置】
     */
    @Test
    public void testLastIndexOf(){
        String s="thinking in java";
        int index=s.lastIndexOf("n");
        System.out.println("最后出现的位置"+index);
    }
    /**
     * 考试重点
     * 【重点:重载功能】
     * subString（int start,int end）方法
     * 用法：截取字符串，从start处开始截取截取到end位置【口诀：含头不含尾】
     * www.baidu.com
     *
     * subString（int start）方法  返回值：String
     * 用法：截取字符串，从start处开始截取，没有end，直接截取到最后
     */
    @Test
    public void testSubString(){
        String url="www.baidu.com";
        //需求：获取当前字符串中：baidu.字符串
        String s=url.substring(5,9);
        System.out.println("截取后的字符串"+s);
        //需求：获取当前url字符串中：baidu.com
        String s1=url.substring(4);
        System.out.println("截取后的字符串"+s1);
    }
    /**
     * trim()
     * 用法：去掉字符串中两边的空格
     * 验证码：X34d            解决并发问题【延迟操作】
     */
    @Test
    public void testTrim(){
        String str=" X34d ";  //字节：12个，空格也是字节
        str=str.trim();       //覆盖：不写前面数据类型
        System.out.println(str);
    }
    /**
     * charAt(int index)    返回值是char类型
     * 用法：返回字符串下标对应的字符
     * 产生异常：StringAPI.testCharAt(StringAPI.java:160)
     *         字符串下标越界异常
     * 产生原因：下标超出字符串实际下标数
     */
    @Test
    public void testCharAt(){
        String str="thinking in java";    //java编程思想
        char c=str.charAt(9);
        System.out.println("返回字符串下标对应的字符"+c);
    }
    /**
     * 验证码：X43d     统一转换为小大写，判断
     * toUpperCase（）  字符串转换为大写
     * toLowercase（）   字符串转换为小写
     */
    @Test
    public void testUL(){
        String str=" X43d ";  //判断：大小写分明   需求：去空格，转大小写
        str=str.toLowerCase().trim();
        System.out.println("转换为小写:"+str);
        str=str.toUpperCase().trim();
        System.out.println("转换为大写:"+str);
    }
    /**
     * 【重点：servlet--javabean获取数据库中数据】
     * 静态方法：通过类名直接调用方法
     * valueOf（基础数据类型的引用）    返回值：String
     * 用法：将java中基础数据类型转换为字符串
     */
    @Test
    public void testValueOf(){
        int i=123;
        String s=String.valueOf(i);
        //验证：当前s对象是否等于“123”   equals（）默认：对比对象，死值对比死值
       if (s.equals("123")){//字面量.equals【字面量】，按照实际值判断
           System.out.println("是字符串，转换成功！");
       }else {
           System.out.println("不是字符串，转换失败！");
       }
    }
    /**
     * 正则表达式：匹配【验证】字符串       ----不作为重点【了解：PHP】
     * 过滤字符串中数值正则写法： ^[0-9]*$ ----JavaScript【重点】
     * matches()方法
     * 作用：用于字符串验证，通过正则表示进行验证【过滤字符】
     */
    public static void main(String[] args) {
    String regex="^[0-9]*$";    //验证数值
         System.out.println("请输入:");
        Scanner input=new Scanner(System.in);      //从控制台输入：用来测试
        //验证：从控制台输入数值，matches方法验证是否是数值
        if (input.nextLine().matches(regex)){
            System.out.println("是数字");
        }else {
            System.out.println("不是数字");
        }
    }
    /**
     * replace(String a,String b)方法       返回值String[子字符串]
     * 第一个参数：String a 要被替换的子串
     * 第二个参数：String b 用于替换的新字符串
     * 作用：用于替换字符串中特定子串  不支持正则
     */
    @Test
    public void testReplace(){
        String url="www.baidu.com";
        url=url.replace("baidu","HLK");    //覆盖
        System.out.println("替换的子字符串："+url);
    }
    /**
     * replaceAll(正则，过滤内容)  替换字符串
     * 作用：替换所有字符串的内容，但是支持正则
     */
    @Test
    public void testAll(){
        String regex="^[\\u4e00-\\u9fa5]{0,}$";
        String str="字符串";
        //str.replaceAll(regex,"***");   //支持正则
        str=str.replace(regex,"***"); //不支持正则
        System.out.println("支持正则："+str);
    }
    /**
     * split（）     返回值：String[]    返回数组--遍历
     * 作用：按照正则或者字符串方式进行分割字符串
     *\\.代表.
     * 需求：www.baidu.com按照点的方式分割url地址
     */
    @Test
    public void testSpilt(){
        String url="www.baidu.com";
         String[] str=url.split("\\.");
        //增强for  遍历 str 字符串数组
        for (String s:str){ //接收类型：字符串数组的引用
            System.out.println("切割后的子字符串:"+s);
        }
        System.out.println(str[1]);
    }

}